﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Course4
{
    /// <summary>
    /// 反射
    /// 学习反射的基本api
    /// 学习对象的动态创建
    /// 学习类库的知识
    /// 学习程序集的概念
    /// </summary>
    internal class Example
    {
        /// <summary>
        /// 获取类型
        /// </summary>
        public void Test()
        {
            var type1 = typeof(Example);
            var obj = new Example();
            var type2 = obj.GetType();
        }
        public void Test1()
        {
            var type1 = typeof(Example);
            //调用无参数构造器
            var obj = Activator.CreateInstance(type1) as Example;
            var obj2 = Activator.CreateInstance<Example>();
        }
        public void Test2()
        {
            var type1 = typeof(Example);
            //获取所有成员
            var members = type1.GetMembers();
            //获取属性
            type1.GetProperties();
            //获取方法
            type1.GetMethods();
            //获取属性
            type1.GetFields();
        }
        public void Test3()
        {
            var type1 = typeof(Example);
            //获取所有成员
            var ctor = type1.GetConstructor(Type.EmptyTypes);
            var ff = ctor.Invoke(null) as Example;//获取构造器并且执行
        }
        /// <summary>
        /// 执行方法
        /// </summary>
        public void Test4()
        {
            var type1 = typeof(Example);
            var m = type1.GetMethod(nameof(Test3));
            m.Invoke(null,null);
        }
        public void Test5()
        {
            //获取当前程序集下面的所有class
            var type1 = typeof(Example);
            type1.Assembly.GetTypes();
        }
        /// <summary>
        /// 了解emit
        /// 在运行时编写c#代码并且执行
        /// </summary>
        public void Emit()
        {
            
        }
     
    }
}
